package com.lh.project.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lh.project.mapper.BillMapper;
import com.lh.project.model.entity.Bill;
import com.lh.project.model.entity.Order;
import com.lh.project.service.BillService;
import com.lh.project.service.FoodService;
import com.lh.project.service.MuzzleService;
import com.lh.project.service.OrderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
*
*/
@Service
public class BillServiceImpl extends ServiceImpl<BillMapper, Bill>
implements BillService {

    @Resource
    private BillMapper billMapper;

    @Resource
    private OrderService orderService;
    @Resource
    private FoodService foodService;

    @Override
    public List<Bill> getByUserId(Long userId) {

        List<Bill> list = billMapper.getBillByUserId(userId);
        //求出每个账单的结账截至时间
        for(int i = 0;i < list.size();i++){
            Bill bill = list.get(i);
            Date createTime = bill.getCreateTime();
            // 将 Date 类型的时间转换成 LocalDateTime 类型
            LocalDateTime localDateTime = LocalDateTime.ofInstant(createTime.toInstant(), ZoneId.systemDefault());
            // 时间加上两个小时
            LocalDateTime newLocalDateTime = localDateTime.plus(2, ChronoUnit.HOURS);
            // 创建 DateTimeFormatter 对象
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
            // 将 LocalDateTime 转换为指定格式的字符串
            list.get(i).setEndTime(newLocalDateTime.format(formatter));
        }
        return list;
    }

    /**
     * 该方法用来生成账单
     * @param arr
     * @return
     */
    @Override
    @Transactional
    public boolean createBill(List<Long> arr,Long userId) {
        //获取到了各个订单的id，为其生成统一的账单，这里账单和订单是1-n的关系
        //统一支付的即构成一个账单
        //在我们的业务逻辑中，当用户点击了立即预定之后，在逻辑上就已经支付了，就属于一个账单了，账单生成之后，用户是不可以再取消的！
        //即统一传过来的菜品都是属于一个账单了

        //巴拉巴拉，综合之下，选择一对一的关系,详情看下面
        /*
        * 设计的账单和订单的关系是1-n的关系，即一个账单中有多个订单，
        * 这就是以你付款来确定的（即只要是一起点击”确认预定“按钮的订单就是一个账单）
        * （其实由于技术的原因，我并不知道用户是否支付了，这个可能得后台专门去记录需要，就是阿姨记一下，
        * 今天谁取了餐且支付了订单，阿姨会再规定的时间内，上交名额，
        * 系统会自动去修改账单的状态），但是这莫一想，是不是账单和订单一对一的关系更好点，
        * 因为学生取餐，可能取了一起”确认预定“的一部分餐，其它没取，也没支付！
        * */

        //只要是一次确认的订单，生成的取餐码都是一样的哦~
        //总之只要是一个人一起点击“确认订单”的他们的取餐码，过期时间，创建时间都是一样的！哎！直觉告诉我，这样的设计不太合理

        //这里的random是本次所有订单所生成账单的取餐号
        Random random = new Random();
        int ran = random.nextInt(10000);
        List<Bill> billList = new ArrayList<>(arr.size());
        for(Long orderId:arr){
            Bill bill = new Bill();
            Order order = orderService.getById(orderId);
            System.out.println("在生成账单的时候，查到的相对于的订单："+order);
            //设置账单所对应的订单id
            bill.setBillOrderId(order.getOrderId());
            //设置了账单的价格
            bill.setBillValue(order.getOrderPayValue());
            //设置账单的拥有者
            bill.setUserId(userId);
            //设置账单对应的菜品id
            bill.setFoodId(order.getOrderFoodId());
            //还得生成一个全局取餐号，我想用redis来实现，但是
            //TODO 使用Redis实现取餐号，目前先使用随机数
            bill.setBillNumber(ran);
            billList.add(bill);
            //产生账单的同时，你得跟新food的sell_count和muzzle_sell_count
            //这里加sellCount先加它被购买的次数吧~不管每次的count了(即每次买的时候，可以买1，2……份）
            //但是直觉告诉我，还是最好使用count的吧
            foodService.addSellCount(order.getOrderCount(),order.getOrderFoodId());
            //将生成的账单的order删除
            orderService.deleteOrder(orderId);
        }
        return saveBatch(billList);
    }
}
